package com.k.kc.util;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @param <T>
 * @author k
 */
public class PageUtils<T> {
    /**
     * 获取 总页数
     *
     * @param total    总记录数
     * @param pageSize 每页数量
     * @return 总页数
     */
    private long getTotalPage(int total, int pageSize) {
        return (total % pageSize > 0 ? 1 : 0) + (total / pageSize);
    }

    /**
     * 获取 offset
     *
     * @param pageNo   当前页码
     * @param pageSize 每页条数
     * @return 偏移量
     */
    private long getOffset(long pageNo, long pageSize) {
        return pageNo < 1 ? 0L : (pageNo - 1) * pageSize;
    }

    /**
     * 获取分页数据
     *
     * @param list     list
     * @param pageNo   页码
     * @param pageSize 每页数量
     */
    private <E> List<E> getPageData(List<E> list, long pageNo, long pageSize) {
        return list.stream()
                .skip(getOffset(pageNo, pageSize))
                .limit(pageSize)
                .collect(Collectors.toList());
    }

    /**
     * 获取总数据
     *
     * @param list     list
     * @param pageSize 每页数量
     * @return 分页数据 (所有数据,带页码)
     */
    private Map<Integer, List<String>> getPageDataAll(List<String> list, int pageSize) {
        Map<Integer, List<String>> map = new HashMap<>(32);
        long totalPage = getTotalPage(list.size(), pageSize);
        for (int i = 1; i <= totalPage; i++) {
            List<String> itmList = getPageData(list, i, pageSize);
            map.put(i, itmList);
        }
        return map;
    }

    public static void main(String[] args) {
        PageUtils<String> pageUtils = new PageUtils<>();

        // 原始数据
        int loopSize = 28;
        String[] idarr = new String[loopSize];
        for (int i = 0; i < loopSize; i++) {
            idarr[i] = i + "";
        }
        List<String> list = Arrays.asList(idarr);
        System.out.println("原始数据:" + list);

        // 对原始数据进行分页
        int pageSize = 10;
        Map<Integer, List<String>> map = pageUtils.getPageDataAll(list, pageSize);
        for (Map.Entry<Integer, List<String>> entry : map.entrySet()) {
            // 发送多次 数据库 请求 查询
            Integer curPage = entry.getKey();
            List<String> pageData = entry.getValue();
            System.out.println("第" + curPage + "页" + " 数据：" + pageData);
        }
    }
}
